package com.lening.community.controller;


import org.springframework.http.MediaType;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

/**
 * @ToDo:
 * @Author：潘万法
 * @date: 2024/6/19 15:41
 */


@RestController
@EnableScheduling
@RequestMapping("sse")
public class SseController {

    private final ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();
    private SseEmitter emitter;

    // 假设这是你的SSE端点
    @GetMapping(value = "stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
    public SseEmitter startStream() {
        emitter = new SseEmitter(Long.MAX_VALUE); // 无限期发送SSE

        // 使用ScheduledExecutorService来定期调用其他接口并发送数据
        scheduler.scheduleAtFixedRate(() -> {
            try {
                // 模拟调用其他接口获取数据
                String dataFromOtherApi = fetchDataFromOtherApi(); // 你需要实现这个方法
                emitter.send(dataFromOtherApi); // 发送数据给前端
            } catch (Exception e) {
                emitter.completeWithError(e);
            }
        }, 0, 10, TimeUnit.SECONDS); // 每秒执行一次

        return emitter;
    }

    // 模拟从其他接口获取数据的方法
    @GetMapping("s")
    private String fetchDataFromOtherApi() {
        // 这里你可以使用RestTemplate或其他HTTP客户端库来调用其他接口
        // 假设我们直接返回一个模拟的JSON字符串
        return "{\"message\": \"这是从其他接口获取的实时消息1\"}";
    }

    // ... 其他代码，如关闭emitter等 ...
}